package com.example.sunnyweather.logic.ui.place


import android.content.Intent
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.observe
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.sunnyweather.MainActivity
import com.example.sunnyweather.R
import com.example.sunnyweather.logic.ui.weather.WeatherActivity
import kotlinx.android.synthetic.main.fragment_place.*

class PlaceFragment : Fragment() {
    // 在使用lateinit 定义的变量前 一定会给他一个实例 保证他不会是空对象 而 by lazy 则是在第一次使用时 初始化对象
    val viewModel by lazy {
        // 通过ViewModelProviders得到ViewModel
        ViewModelProvider(this).get(PlaceViewModel::class.java)
    }
    private lateinit var adapter: PlaceAdapter
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_place, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        // 如果保存过城市，直接加载这个城市的信息
        // 还要防止循环跳转
        // 只有当PlaceFragment被嵌入MainActivity中，并且之前已经存 在选中的城市，此时才会直接跳转到WeatherActivity，
        // MainActivity其实就是刚打开时的界面，如果是刚打开，并且有保存的地址，就跳转到天气界面，
        // 如果是在天气界面进入的PlaceFragment，就不能再打开WeatherActivity了，应该直接显示PlaceFragment
        if (activity is MainActivity && viewModel.isPlaceSaved()) {
            val place = viewModel.getSavedPlace()
            val intent = Intent(context, WeatherActivity::class.java).apply {
                putExtra("location_lng", place.location.lng)
                putExtra("location_lat", place.location.lat)
                putExtra("place_name", place.name)
            }
            startActivity(intent)
            activity?.finish()
            return
        }

        // recycleView设置
        val layoutManager = LinearLayoutManager(activity)
        recyclerView.layoutManager = layoutManager
        adapter = PlaceAdapter(this, viewModel.placeList)
        recyclerView.adapter = adapter

        //监听搜索框文本变化
        searchPlaceEdit.addTextChangedListener(object : TextWatcher {

            // 这个方法被调用，那么说明s字符串的某个地方已经被改变。
            override fun afterTextChanged(editable: Editable?) {
                Log.d("aa","afterTextChanged")
                val content = editable.toString()
                if (content.isNotEmpty()) {
                    viewModel.searchPlaces(content)
                } else {
                    recyclerView.visibility = View.GONE
                    bgImageView.visibility = View.VISIBLE
                    viewModel.placeList.clear()
                    adapter.notifyDataSetChanged()
                }
            }

            // 这个方法被调用，说明在s字符串中，从start位置开始的count个字符即将被长度为after的新文本所取代。在这个方法里面改变s，会报错。
            override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
                Log.d("aa","beforeTextChanged")

//                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
            }

            // 这个方法被调用，说明在s字符串中，从start位置开始的count个字符刚刚取代了长度为before的旧文本。在这个方法里面改变s，会报错。
            override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
                Log.d("aa","onTextChanged")
//                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
            }
        })

        // 通过LiveData.observe()实现对ViewModel中数据变化的观察,变化了， result 是 Result<List<Place>>
        // 观察者是这个Fragment自己，也就是第一个参数getViewLifecycleOwner(),第二个参数是发生变化之后要执行的逻辑
        viewModel.placeLiveData.observe(viewLifecycleOwner, Observer { result ->
            val places = result.getOrNull()
            if (places != null) {
                recyclerView.visibility = View.VISIBLE
                bgImageView.visibility = View.GONE
                viewModel.placeList.clear()
                viewModel.placeList.addAll(places)
                adapter.notifyDataSetChanged()
            } else {
                Toast.makeText(activity, "未能查询到任何地点", Toast.LENGTH_SHORT).show()
                result.exceptionOrNull()?.printStackTrace()
            }
        })
    }
}
